Expand description
muda is a Menu Utilities library for Desktop Applications.
§Platforms supported:
- Windows
- macOS
- Linux (gtk Only)
§Platform-specific notes:
-
On macOS, menus can only be used from the main thread, and most functionality will panic if you try to use it from any other thread.
-
On Windows, accelerators don’t work unless the win32 message loop calls
TranslateAcceleratorW
. SeeMenu::init_for_hwnd
for more details
§Dependencies (Linux Only)
gtk
is used for menus and libxdo
is used to make the predfined Copy
, Cut
, Paste
and SelectAll
menu items work. Be sure to install following packages before building:
§Arch Linux / Manjaro:
pacman -S gtk3 xdotool
§Debian / Ubuntu:
sudo apt install libgtk-3-dev libxdo-dev
§Example
Create the menu and add your items
let menu = Menu::new();
let menu_item2 = MenuItem::new("Menu item #2", false, None);
let submenu = Submenu::with_items(
"Submenu Outer",
true,
&[
&MenuItem::new(
"Menu item #1",
true,
Some(Accelerator::new(Some(Modifiers::ALT), Code::KeyD)),
),
&PredefinedMenuItem::separator(),
&menu_item2,
&MenuItem::new("Menu item #3", true, None),
&PredefinedMenuItem::separator(),
&Submenu::with_items(
"Submenu Inner",
true,
&[
&MenuItem::new("Submenu item #1", true, None),
&PredefinedMenuItem::separator(),
&menu_item2,
],
).unwrap(),
],
);
Then add your root menu to a Window on Windows and Linux or use it as your global app menu on macOS
// --snip--
#[cfg(target_os = "windows")]
unsafe { menu.init_for_hwnd(window_hwnd) };
#[cfg(target_os = "linux")]
menu.init_for_gtk_window(>k_window, Some(&vertical_gtk_box));
#[cfg(target_os = "macos")]
menu.init_for_nsapp();
§Context menus (Popup menus)
You can also use a Menu
or a Submenu
show a context menu.
use muda::ContextMenu;
// --snip--
let position = muda::dpi::PhysicalPosition { x: 100., y: 120. };
#[cfg(target_os = "windows")]
unsafe { menu.show_context_menu_for_hwnd(window_hwnd, Some(position.into())) };
#[cfg(target_os = "linux")]
menu.show_context_menu_for_gtk_window(>k_window, Some(position.into()));
#[cfg(target_os = "macos")]
unsafe { menu.show_context_menu_for_nsview(nsview, Some(position.into())) };
§Processing menu events
You can use MenuEvent::receiver
to get a reference to the MenuEventReceiver
which you can use to listen to events when a menu item is activated
if let Ok(event) = MenuEvent::receiver().try_recv() {
match event.id {
id if id == save_item.id() => {
println!("Save menu item activated");
},
_ => {}
}
}
Re-exports§
pub use about_metadata::AboutMetadata;
pub use crate::about_metadata::AboutMetadataBuilder;
pub use crate::accelerator::AcceleratorParseError;
pub use dpi;
Modules§
- Types and functions to create
AboutMetadata
for thePredefinedMenuItem::about
dialog. - Accelerators describe keyboard shortcuts for menu items.
Structs§
- A builder type for
CheckMenuItem
- An icon used for the window titlebar, taskbar, etc.
- A builder type for
IconMenuItem
- A root menu that can be added to a Window on Windows and Linux and used as the app global menu on macOS.
- Describes a menu event emitted when a menu item is activated
- An unique id that is associated with a menu or a menu item.
- A builder type for
MenuItem
- A predefined (native) menu item which has a predfined behavior by the OS or by this crate.
- A builder type for
Submenu
Enums§
- An error produced when using
Icon::from_rgba
with invalid arguments. - Errors returned by muda.
- An enumeration of all available menu types, useful to match against the items returned from
Menu::items
orSubmenu::items
- A native Icon to be used for the menu item
Traits§
- A helper trait with methods to help creating a context menu.
- A trait that defines a generic item in a menu, which may be one of
MenuItemKind
Type Aliases§
- A reciever that could be used to listen to menu events.
- Convenient type alias of Result type for muda.